<?php
date_default_timezone_set('PRC'); //设置中国时区
header('Content-Type:text/html;charset=utf-8');
 // 观察者接口 observer 与被观察者 subject 的接口
/*  observer 下的三个 attach添加 detach删除 notify 通知
 Subject

*/
 
	//观察者接口
	interface Observer {
		function UpdateObs($sender, $args); //得到通知后调用的方法
	}
		//被观察对象接口
	interface SubjectObservable {
		function addObserver($observer); //提供注册观察者方法
	}
#====================主题类实现========================

//主题类

class HipiaoBuy implements SubjectObservable { //实现主题接口（被观察者）
    private $_observers = array (); //通知数组（观察者）
    public function buyTicket($ticket) 
    {
        //循环通知
        foreach ( $this->_observers as $obs ){
            $obs->UpdateObs ( $this, $ticket ); //$this 可用来获取主题类句柄，在通知中使用
        }
    }
    //添加通知
    public function addObserver($observer) //添加N个通知
    {
        $this->_observers [] = $observer;
    }
}

#=========================通知====================
//短信日志通知
class HipiaoMSM implements Observer {
    public function UpdateObs($sender, $ticket) {
        echo (date ( 'Y-m-d H:i:s' ) . " 短信日志记录：购票成功:$ticket<br>");
    }
}
//文本日志通知
class HipiaoTxt implements Observer {
    public function UpdateObs($sender, $ticket) {
        echo (date ( 'Y-m-d H:i:s' ) . " 文本日志记录：购票成功:$ticket<br>");
    }
}
//抵扣卷赠送通知
class HipiaoDiKou implements Observer {
    public function UpdateObs($sender, $ticket) {
        echo (date ( 'Y-m-d H:i:s' ) . " 赠送抵扣卷：购票成功:$ticket 赠送10元抵扣卷1张。<br>");
    }
}
#============================用户购票====================
$buy = new HipiaoBuy ();
$buy->addObserver ( new HipiaoMSM () ); //根据不同业务逻辑加入各种通知
$buy->addObserver ( new HipiaoTxt () );
$buy->addObserver ( new HipiaoDiKou () );
//购票
$buy->buyTicket ( "一排一号" );
 